package kt02

class AndroidClickListener<T> {
    private val actions = arrayListOf<(T?) -> Unit>()
    private val values = arrayListOf<T?>()

    fun addListener(value: T?, action: (T?) -> Unit) {
//        if (!actions.contains (action)){
        actions += action //添加用户自定义事件到集合
        values += value //添加用户自定义数据到集合
    }
//    }

    fun touchListeners() {
        if (actions.isEmpty()) {
            println("你还没有添加任何事件")
            return
        }
        actions.forEachIndexed { index, item ->
            item.invoke(values[index])// 执行所有的元素 == lambda规则 == 用户自定义事件体
        }
    }

}

fun main() {
    val func = AndroidClickListener<String>()
    func.touchListeners()

    func.addListener("1") {
        println("事件被触发了 执行值是$it")
    }
    func.addListener("2") {
        println("事件被触发了 执行值是$it")
    }
    func.addListener("3") {
        println("事件被触发了 执行值是$it")
    }

    func.touchListeners()

    func.addListener("4", ::show1)
    val result: (Any?) -> Unit = ::show1
    func.addListener("5", result)
    val result2: (Any?) -> Unit = {
        println("Hello 事件被触发，执行的值是:$it")
    }

    func.addListener("6", result2)
    // 异步在lambda想要实现泛型，基本上做不到，用Any代替
    val method01 : (Any) -> Unit = {}

    // lambda无法玩泛型

    func.touchListeners()
}

fun <T> show1(value: T?) {
    println("事件函数 事件被触发了 执行了 值是:$value")
}

